import numpy as np
import pandas as pd
import folium
import json
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import plotly.plotly as py
import plotly.graph_objs as go
import plotly
plotly.tools.set_credentials_file(username='sl4430', api_key='qAZq4fHIKjJmfzniie8f')
import requests
from bs4 import BeautifulSoup
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import linear_model
transaction=pd.read_excel("transaction.xlsx",sheet_name="Dining Transaction",header=0)
tra_HK=transaction[transaction['En Name (Place City)']=='Hong Kong']
tra_HK.head()#15200 rows × 25 columns
tra_HK.describe()
plt.style.use('seaborn')
Producerflavor= tra_HK.groupby('En Name (Products Producerflavor)').size().sort_values(ascending=False)
#transaction number /number of restaurants for this type
Producerflavor=pd.DataFrame(Producerflavor)
Producerflavor['Name']=Producerflavor.index
Producerflavor['Number']=Producerflavor['Name'].apply(lambda x: len(tra_HK[tra_HK['En Name (Products Producerflavor)']==x]['En Name (Products Producer)'].unique()))
Producerflavor['Average']=Producerflavor[0]/Producerflavor['Number']
Producerflavor=Producerflavor.sort_values('Average',ascending=False)
trace0 = go.Bar(
x=Producerflavor[:5]["Name"],
y=Producerflavor[:5]['Average'],
# text=['1', '2, '3','4','5'],
marker=dict(
color=['darkred','red','salmon','darkorange','yellow',],
line=dict(
color='rgb(8,48,107)',
width=1.5,
)
),
opacity=0.6
)
data = [trace0]
layout = go.Layout(
title='Average Transaction for each Restaurant Flavor',
)
fig = go.Figure(data=data, layout=layout)
py.iplot(fig, filename='text-hover-bar')
import datetime
tra_HK['paid hour'] = tra_HK['Time Paid (SECOND)'].apply(lambda x: datetime.datetime.strftime(x, '%H'))
tra_HK['paid_day_of_week'] = tra_HK['Time Paid (SECOND)'].apply(lambda x:x.isoweekday())
paid_day_of_week=tra_HK.groupby('paid_day_of_week').size()
# Create a trace
trace = go.Scatter(
x = paid_day_of_week.index,
y = paid_day_of_week
)
data = [trace]
py.iplot(data, filename='Paid Day of Week')
paid_hour=tra_HK.groupby('paid hour').size()
trace = go.Scatter(
x = paid_hour.index,
y = paid_hour
)
layout = go.Layout(
title='Paid Hour',
)
data = [trace]
py.iplot(data, filename='Paid Hour')
Groupby_customer = tra_HK.groupby(['Name (Promotion Multiplepromotion)']).size()
Groupby_customer = Groupby_customer.sort_values(ascending=False)
# print(tra_HK['Name (Promotion Multiplepromotion)'].unique())
data = [go.Bar(
x=Groupby_customer.index[:5],
y=Groupby_customer[:5]
)]
py.iplot(data, filename='Campaign')
Groupby_customer = tra_HK.groupby(["User Id","En Name (Products Producer)"]).size().unstack()
avg_loyalty = pd.DataFrame(Groupby_customer.mean())
avg_loyalty = avg_loyalty.rename(columns={0:"Average Loyalty"})
avg_loyalty = avg_loyalty.sort_values(by="Average Loyalty",ascending=False).head()
trace0 = go.Bar(
x=avg_loyalty.index,
y=avg_loyalty['Average Loyalty'],
marker=dict(
color=['navy','blue','dodgerblue','skyblue','powderblue'],
line=dict(
color='rgb(8,48,107)',
width=1.5,
)
),
opacity=0.6
)
data = [trace0]
layout = go.Layout(
title='Customer Loyalty',
)
fig = go.Figure(data=data, layout=layout)
py.iplot(fig, filename='Customer Loyalty')
Groupby_Area = pd.DataFrame(tra_HK.groupby(["En Name (Products Bizarea)"]).size())
Groupby_Area = Groupby_Area.rename(columns={0:"Transaction Frequency"})
Groupby_Area['Bizarea'] = Groupby_Area.index
api_key='AIzaSyB8ssI42-_cXub3e_CZzkmkTTaGDqYdaEc'
def get_location(query):
query=query.replace(' ','+')
url="https://maps.googleapis.com/maps/api/place/textsearch/json?" +"query="+query+"&key="+ api_key
response_data = ''
try:
response=requests.get(url)
response_data = response.json()
data = response_data['results'][0]
location=data['geometry']['location']
except:
location=None
return location
# Groupby_Area['location']= Groupby_Area['Bizarea'].apply(lambda x: get_location(x, api_key))
# Groupby_Area = Groupby_Area.dropna()
# Groupby_Area.to_excel(r'./Groupby_Area.xlsx',columns=['Transaction Frequency','Bizarea','location'], index=False,encoding='utf-8')
Area = pd.read_excel("Groupby_Area.xlsx",header=0)
import json
import geojson
with open("hksar_18_district_boundary.json","r") as f:
shape = json.loads(f.read())
features = shape['features']
polygon = []
for dict_ in features:
polygon.append(dict_['geometry']['coordinates'][0])
from shapely.geometry import Polygon, Point, MultiPolygon
poly_list=[]
for p in polygon:
poly = Polygon(p)
poly_list.append(poly)
import ast
for i in range(Area.shape[0]):
for p in range(len(poly_list)):
try:
loca = ast.literal_eval(Area.loc[i].loc["location"])
x = loca['lat']
y = loca['lng']
point = Point(y, x)
if poly_list[p].contains(point):
Area.loc[i,"poly_num"] = p
except:
pass
Area = Area.dropna()
Transaction_Frequency = pd.DataFrame(Area.groupby("poly_num").sum())
Transaction_Frequency.loc[12] = 0
Transaction_Frequency_ = pd.Series(list(Transaction_Frequency["Transaction Frequency"]),index=Transaction_Frequency.index)
TFasc = Transaction_Frequency.sort_values(by="Transaction Frequency")
TFasc_ = pd.Series(range(18),index=TFasc.index)
m = folium.Map(location = [22.28056,114.17222],zoom_start=10)
def process_coord(poly):
new_poly = []
for coord in poly:
new_poly.append(list(coord))
return new_poly
def createGeoJsonObject(poly_list):
zone_data_dict = dict()
zone_data_dict['type'] = 'FeatureCollection'
zone_data_dict_features = list()
zone_data_dict['features'] = zone_data_dict_features
for i in range(len(poly_list)):
zone_feature = dict()
zone_id = i
coordinates = process_coord(list(poly_list[i].exterior.coords))
zone_feature['geometry'] = dict()
zone_feature['geometry']['coordinates'] = [coordinates]
zone_feature['geometry']['type'] = 'Polygon'
zone_feature['properties'] = dict()
zone_feature['properties']['zone_id'] = zone_id
zone_feature['type'] = 'Feature'
zone_data_dict['features'].append(zone_feature)
return zone_data_dict
zone_data_dict=createGeoJsonObject(poly_list)
m.choropleth(geo_data=json.dumps(zone_data_dict),data=Transaction_Frequency_,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.3,line_opacity=0.4)
folium.LayerControl().add_to(m)
m
n = folium.Map(location = [22.28056,114.17222],zoom_start=10)
n.choropleth(geo_data=json.dumps(zone_data_dict),data=TFasc_,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.3,line_opacity=0.4)
folium.LayerControl().add_to(n)
n
seed = 1
np.random.seed(seed)
Y=tra_HK['paycommission_current (SUM)']
X=tra_HK[['Miles (SUM)','Promotion Miles (SUM)','Voucher Miles (SUM)','paid hour','paid_day_of_week']]
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.25)
regr = linear_model.LinearRegression()
regr.fit(X_train, Y_train)
Y_pred=regr.predict(X_test)
dY=(Y_test-Y_pred)
np.dot(dY.T,dY)/len(dY)
from sklearn import preprocessing
X_normalized = preprocessing.normalize(X, norm='l2')
Y=Y.to_frame(name=None)
Y_normalized = preprocessing.normalize(Y,norm='l2')
np.random.seed(seed)
X=tra_HK[['Miles (SUM)','Promotion Miles (SUM)','Voucher Miles (SUM)','paid hour','paid_day_of_week']]
X_train,X_test,Y_train,Y_test=train_test_split(X_normalized,Y_normalized,test_size=0.25)
regr = linear_model.LinearRegression()
regr.fit(X_train, Y_train)
Y_pred=regr.predict(X_test)
dY=(Y_test-Y_pred)
np.dot(dY.T,dY)/len(dY)
def categorize_Y(pc):
if ((pc > 16.2) and (pc <= 36.215)) :
a = 1.0
elif ((pc > 36.215) and (pc <= 61.35)) :
a = 2.0
elif pc >61.35:
a = 3.0
else:
a = 4.0
return a
y_category = pd.Series(Y.values).apply(categorize_Y)
from sklearn.tree import DecisionTreeClassifier # Import Decision Tree Classifier
from sklearn.model_selection import train_test_split # Import train_test_split function
from sklearn import metrics #Import scikit-learn metrics module for accuracy calculationv
np.random.seed(seed)
X_train,X_test,Y_train,Y_test=train_test_split(X,y_category,test_size=0.25)
feature_cols = ['Miles (SUM)', 'Promotion Miles (SUM)', 'Voucher Miles (SUM)', 'paid hour','paid_day_of_week']
lab_enc = preprocessing.LabelEncoder()
X_train['Miles (SUM)'] = lab_enc.fit_transform(X_train['Miles (SUM)'])
X_train['Promotion Miles (SUM)'] = lab_enc.fit_transform(X_train['Promotion Miles (SUM)'])
X_train['Voucher Miles (SUM)'] = lab_enc.fit_transform(X_train['Voucher Miles (SUM)'])
X_train['paid hour'] = lab_enc.fit_transform(X_train['paid hour'])
X_train['paid_day_of_week'] = lab_enc.fit_transform(X_train['paid_day_of_week'])
Y_train = lab_enc.fit_transform(Y_train)
Y_test = lab_enc.fit_transform(Y_test)
clf = DecisionTreeClassifier()
clf = clf.fit(X_train,Y_train)
y_pred = clf.predict(X_test)
y_pred
# Accuracy is 1.5% which is very poor
print("Accuracy:",metrics.accuracy_score(Y_test, y_pred))
# Pruning the tree
clf = DecisionTreeClassifier(criterion="entropy", max_depth=3)
clf = clf.fit(X_train,Y_train)
y_pred = clf.predict(X_test)
print("Accuracy:",metrics.accuracy_score(Y_test, y_pred))
# Accuracy goes up to 2.5%, still not ideal
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import MinMaxScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import label_binarize
rfc = RandomForestClassifier()
model = rfc.fit(X_train, Y_train)
y_pred = model .predict(X_test)
print("Accuracy:",metrics.accuracy_score(Y_test, y_pred))
#con_data['En Name (Products Producer)']=control.index
#ccon_data['location']= control['En Name (Products Producer)'].apply(lambda x: get_location(x))
# with open('control group with location', 'a+') as f:
# control.to_csv(f, header=False)
location = pd.read_excel("Control group with location.xlsx",index_col=0)
location = location.dropna()
##control group
data=tra_HK[tra_HK['Name (Promotion Multiplepromotion)'].isnull()]
con_data=data.groupby('En Name (Products Producer)').mean()
def difference(df):
paycommission_diff_list=[]
pct_paycommission_diff_list=[]
new_index=[]
for i in df.index:
try:
paycommission = df.loc[i].loc["paycommission_current (SUM)"]
con_paycommission = con_data.loc[i].loc["paycommission_current (SUM)"]
total_price = df.loc[i].loc["Total Price (SUM)"]
con_total_price = con_data.loc[i].loc["Total Price (SUM)"]
#total_mile = df.loc[i].loc["Miles (SUM)"]
#con_total_mile = con_data.loc[i].loc["Miles (SUM)"]
paycommission_diff = paycommission - con_paycommission
pct_paycommission_diff = (paycommission_diff / con_paycommission) * 100
paycommission_diff_list.append(paycommission_diff)
pct_paycommission_diff_list.append(pct_paycommission_diff)
new_index.append(i)
except:
pass
new_df = pd.DataFrame([paycommission_diff_list,pct_paycommission_diff_list]).T
new_df.columns = ["Actual Revenue Difference","Actual Revenue Change in %"]
new_df.index = new_index
return new_df
#September 3X ANA miles
data10=tra_HK.loc[(tra_HK['Name (Promotion Multiplepromotion)']=='全场3倍全日空里程累积')|(tra_HK['Name (Promotion Multiplepromotion)']=='3倍全日空里數累積')|(tra_HK['Name (Promotion Multiplepromotion)']=='September 3X ANA miles')]
data10=data10.groupby('En Name (Products Producer)').mean()
result1 = difference(data10)
import json
import geojson
with open("hksar_18_district_boundary.json","r") as f:
shape = json.loads(f.read())
features = shape['features']
polygon = []
for dict_ in features:
polygon.append(dict_['geometry']['coordinates'][0])
#!pip install pyshp
from shapely.geometry import Polygon, Point, MultiPolygon
poly_list=[]
for shape in polygon:
poly = Polygon(shape)
poly_list.append(poly)
result1.loc[:,"poly_num"] = 0
result1 = result1.dropna()
import ast
for i in result1.index:
for p in range(len(poly_list)):
try:
loca = ast.literal_eval(location.loc[i].loc["location"])
x = loca['lat']
y = loca['lng']
point = Point(y, x)
if poly_list[p].contains(point):
result1.loc[i,"poly_num"] = p
except:
pass
mean_effect1 = pd.DataFrame(result1.groupby("poly_num").mean())
mean_effect1.loc[17,:] = 0
mean_effect1.loc[11,:] = 0
mean_effect1.loc[12,:] = 0
mean_effect1 = mean_effect1.sort_values("poly_num")
mean_effect_1 = pd.Series(list(mean_effect1["Actual Revenue Difference"]),index=mean_effect1.index)
measc1 = mean_effect1.sort_values(by="Actual Revenue Difference")
measc_1 = pd.Series(range(18),index=measc1.index)
print(measc1['Actual Revenue Difference'].mean())
print(measc1['Actual Revenue Difference'].sum())
def process_coord(poly):
new_poly = []
for coord in poly:
new_poly.append(list(coord))
return new_poly
zone_data_dict = createGeoJsonObject(poly_list)
m = folium.Map(location = [22.28056,114.17222],zoom_start=10)
m.choropleth(geo_data=json.dumps(zone_data_dict),data=mean_effect_1,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.3,line_opacity=0.4)
folium.LayerControl().add_to(m)
m
mm = folium.Map(location = [22.28056,114.17222],zoom_start=10)
mm.choropleth(geo_data=json.dumps(zone_data_dict),data=measc_1,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.3,line_opacity=0.4)
folium.LayerControl().add_to(mm)
mm
data1=tra_HK.loc[(tra_HK['Name (Promotion Multiplepromotion)']=='爱恋和风滋味 2倍里程')|(tra_HK['Name (Promotion Multiplepromotion)']=='愛戀和風滋味 2倍里數獎賞')|(tra_HK['Name (Promotion Multiplepromotion)']=='Traditional Japanese Taste 2x Bonus Miles')]
data1=data1.groupby('En Name (Products Producer)').mean()
result2 = difference(data1)
result2.loc[:,"poly_num"] = 0
result2 = result2.dropna()
import ast
for i in result2.index:
for p in range(len(poly_list)):
try:
loca = ast.literal_eval(location.loc[i].loc["location"])
x = loca['lat']
y = loca['lng']
point = Point(y, x)
if poly_list[p].contains(point):
result2.loc[i,"poly_num"] = p
except:
pass
mean_effect2 = pd.DataFrame(result2.groupby("poly_num").mean())
mean_effect2.loc[1,:] = 0
mean_effect2.loc[2,:] = 0
mean_effect2.loc[3,:] = 0
mean_effect2.loc[4,:] = 0
mean_effect2.loc[5,:] = 0
mean_effect2.loc[6,:] = 0
mean_effect2.loc[7,:] = 0
mean_effect2.loc[8,:] = 0
mean_effect2.loc[9,:] = 0
mean_effect2.loc[12,:] = 0
mean_effect2.loc[13,:] = 0
mean_effect2.loc[14,:] = 0
mean_effect2.loc[15,:] = 0
mean_effect2.loc[16,:] = 0
mean_effect2.loc[17,:] = 0
mean_effect2 = mean_effect2.sort_values("poly_num")
mean_effect_2 = pd.Series(list(mean_effect2["Actual Revenue Difference"]),index=mean_effect2.index)
measc2 = mean_effect2.sort_values(by="Actual Revenue Difference")
measc_2= pd.Series(range(18),index=measc2.index)
print(measc2['Actual Revenue Difference'].mean())
print(measc2['Actual Revenue Difference'].sum())
m1 = folium.Map(location = [22.28056,114.17222],zoom_start=10)
m1.choropleth(geo_data=json.dumps(zone_data_dict),data=mean_effect_2,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.3,line_opacity=0.4)
folium.LayerControl().add_to(m1)
m1
mm1 = folium.Map(location = [22.28056,114.17222],zoom_start=10)
mm1.choropleth(geo_data=json.dumps(zone_data_dict),data=measc_2,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.3,line_opacity=0.4)
folium.LayerControl().add_to(mm1)
mm1
data2=tra_HK.loc[(tra_HK['Name (Promotion Multiplepromotion)']=='Dah Sing 2.5X Avios')|(tra_HK['Name (Promotion Multiplepromotion)']=='大新信用卡2.5倍Avios')|(tra_HK['Name (Promotion Multiplepromotion)']=='2.5X Avios (Dah Sing Credit Card)')]
data2=data2.groupby('En Name (Products Producer)').mean()
result3 = difference(data2)
result3.loc[:,"poly_num"] = 0
result3 = result3.dropna()
import ast
for i in result3.index:
for p in range(len(poly_list)):
try:
loca = ast.literal_eval(location.loc[i].loc["location"])
x = loca['lat']
y = loca['lng']
point = Point(y, x)
if poly_list[p].contains(point):
result3.loc[i,"poly_num"] = p
except:
pass
mean_effect3 = pd.DataFrame(result3.groupby("poly_num").mean())
mean_effect3.loc[17,:] = 0
mean_effect3.loc[13,:] = 0
mean_effect3.loc[12,:] = 0
mean_effect3 = mean_effect3.sort_values("poly_num")
mean_effect_3 = pd.Series(list(mean_effect3["Actual Revenue Difference"]),index=mean_effect3.index)
measc3 = mean_effect3.sort_values(by="Actual Revenue Difference")
measc_3 = pd.Series(range(18),index=measc3.index)
print(measc3['Actual Revenue Difference'].mean())
print(measc3['Actual Revenue Difference'].sum())
m2 = folium.Map(location = [22.28056,114.17222],zoom_start=10)
m2.choropleth(geo_data=json.dumps(zone_data_dict),data=mean_effect_3,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.3,line_opacity=0.4)
folium.LayerControl().add_to(m2)
m2
mm2 = folium.Map(location = [22.28056,114.17222],zoom_start=10)
mm2.choropleth(geo_data=json.dumps(zone_data_dict),data=measc_3,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.3,line_opacity=0.4)
folium.LayerControl().add_to(mm2)
mm2
data3=tra_HK.loc[(tra_HK['Name (Promotion Multiplepromotion)']=='11.11 光棍不寂寞 2倍里數')|(tra_HK['Name (Promotion Multiplepromotion)']=='11.11 光棍节2倍里程')|(tra_HK['Name (Promotion Multiplepromotion)']=="11.11 You're Not Alone 2x Bonus Miles")]
data3=data3.groupby('En Name (Products Producer)').mean()
result4 = difference(data3)
result4.loc[:,"poly_num"] = 0
result4 = result4.dropna()
import ast
for i in result4.index:
for p in range(len(poly_list)):
try:
loca = ast.literal_eval(location.loc[i].loc["location"])
x = loca['lat']
y = loca['lng']
point = Point(y, x)
if poly_list[p].contains(point):
result4.loc[i,"poly_num"] = p
except:
pass
mean_effect4 = pd.DataFrame(result4.groupby("poly_num").mean())
mean_effect4.loc[3,:] = 0
mean_effect4.loc[8,:] = 0
mean_effect4.loc[10,:] = 0
mean_effect4.loc[11,:] = 0
mean_effect4.loc[12,:] = 0
mean_effect4.loc[13,:] = 0
mean_effect4.loc[15,:] = 0
mean_effect4.loc[16,:] = 0
mean_effect4.loc[17,:] = 0
mean_effect4 = mean_effect4.sort_values("poly_num")
mean_effect_4 = pd.Series(list(mean_effect4["Actual Revenue Difference"]),index=mean_effect4.index)
measc4 = mean_effect4.sort_values(by="Actual Revenue Difference")
measc_4 = pd.Series(range(18),index=measc4.index)
print(measc4["Actual Revenue Difference"].mean())
print(measc4["Actual Revenue Difference"].sum())
m3 = folium.Map(location = [22.28056,114.17222],zoom_start=10)
m3.choropleth(geo_data=json.dumps(zone_data_dict),data=mean_effect_4,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.3,line_opacity=0.4)
folium.LayerControl().add_to(m3)
m3
mm3 = folium.Map(location = [22.28056,114.17222],zoom_start=10)
mm3.choropleth(geo_data=json.dumps(zone_data_dict),data=measc_4,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.3,line_opacity=0.4)
folium.LayerControl().add_to(mm3)
mm3
data4=tra_HK.loc[(tra_HK['Name (Promotion Multiplepromotion)']=='2X Avios')|(tra_HK['Name (Promotion Multiplepromotion)']=='全場2倍Avios')]
data4=data4.groupby('En Name (Products Producer)').mean()
result5 = difference(data4)
result5.loc[:,"poly_num"] = 0
result5 = result5.dropna()
import ast
for i in result5.index:
for p in range(len(poly_list)):
try:
loca = ast.literal_eval(location.loc[i].loc["location"])
x = loca['lat']
y = loca['lng']
point = Point(y, x)
if poly_list[p].contains(point):
result5.loc[i,"poly_num"] = p
except:
pass
mean_effect5 = pd.DataFrame(result5.groupby("poly_num").mean())
mean_effect5.loc[3,:]=0
mean_effect5.loc[10,:]=0
mean_effect5.loc[12,:]=0
mean_effect5.loc[13,:]=0
mean_effect5.loc[15,:]=0
mean_effect5.loc[16,:]=0
mean_effect5.loc[17,:]=0
mean_effect5 = mean_effect5.sort_values("poly_num")
mean_effect_5 = pd.Series(list(mean_effect5["Actual Revenue Difference"]),index=mean_effect5.index)
difference_in_times = mean_effect_5 - mean_effect_3
print(difference_in_times.mean())
print(difference_in_times.sum())
m5 = folium.Map(location = [22.28056,114.17222],zoom_start=10)
m5.choropleth(geo_data=json.dumps(zone_data_dict),data=difference_in_times,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.5,line_opacity=0.4)
folium.LayerControl().add_to(m5)
m5
measc5 = difference_in_times.sort_values()
measc_5 = pd.Series(range(18),index=measc5.index)
mm5 = folium.Map(location = [22.28056,114.17222],zoom_start=10)
mm5.choropleth(geo_data=json.dumps(zone_data_dict),data=measc_5,
key_on='feature.properties.zone_id',
fill_color='YlOrRd',fill_opacity=0.3,line_opacity=0.4)
folium.LayerControl().add_to(mm5)
mm5